package main

import (
	"fmt"
)

/**
有效的括号
给定一个只包括 '('，')'，'{'，'}'，'['，']' 的字符串 s ，判断字符串是否有效。
有效字符串需满足：
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。

示例 1：
输入：s = "()"
输出：true

示例 2：
输入：s = "()[]{}"
输出：true

示例 3：
输入：s = "(]"
输出：false

示例 4：
输入：s = "([])"
输出：true

示例 5：
输入：s = "([)]"
输出：false

[{([])}]
*/

func main() {
	condition := []string{"(", ")", "[", "]", "{", "}"}
	input := "()[]{}" //  "([])"  "()"  "([)]"  "()[]{}"
	fmt.Println("输入", input)
	if checkInput(condition, input) {
		fmt.Println("不允许的输入")
		return
	}

	res := true
	stack := make([]string, 0, len(condition))
	for _, str := range input {
		if "(" == string(str) || "[" == string(str) || "{" == string(str) {
			stack = append(stack, string(str))
		} else {
			if len(stack) > 0 {
				tail := stack[len(stack)-1]
				if string(str) == ")" {
					if tail != "(" {
						res = false
						break
					}
				} else if string(str) == "]" {
					if tail != "[" {
						res = false
						break
					}
				} else if string(str) == "}" {
					if tail != "{" {
						res = false
						break
					}
				}
				if res {
					stack = stack[:len(stack)-1]
				}
			} else {
				res = false
				break
			}
		}
	}
	fmt.Println("输出：", res)
}

func checkInput(condition []string, input string) bool {
	flag := true
	for _, s := range input {
		for _, str := range condition {
			if string(s) != str {
				flag = false
			}
		}
	}
	return flag
}
